package br.com.pnfp.web.control.actions.cadastros;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import br.com.pnfp.web.control.actions.DefaultAction;
import br.com.pnfp.web.control.forms.cadastros.CadastroUsuarioForm;
import br.com.pnfp.web.control.utils.MailService;
import br.com.pnfp.web.model.enums.Ativo;
import br.com.pnfp.web.model.enums.TipoUsuario;
import br.com.pnfp.web.model.vo.Empresa;
import br.com.pnfp.web.model.vo.Usuario;

public class CadastroUsuarioAction extends DefaultAction {
	
	private static final Logger logger = Logger.getLogger(CadastroUsuarioAction.class); 
	
	@Autowired
	private MailService mailService;
	
	public ActionForward iniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		return mapping.findForward("body");
	}
	
	public ActionForward consultar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		consultar(usuarioForm, request);
		
		return mapping.findForward("body");
	}
	
	public ActionForward incluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
			
		Usuario vo = new Usuario();

		vo.setLogin(usuarioForm.getLogin());
		vo.setUsuarioSistema(getUsuario(request));		
		
		List<Usuario> lista = getUsuarioDAO().consultar(vo);
		if(lista.size() == 0){
			vo.setNome(usuarioForm.getNome());
			//vo.setSenha(gerarSenhaRandomica());
			vo.setSenha("1234");
			vo.setEmail(usuarioForm.getEmail());
			vo.setTelefone(usuarioForm.getTelefone());
			
			vo.setTipo(TipoUsuario.setValue(usuarioForm.getAdmin())); 
			vo.setEmpresa(getUsuario(request).getEmpresa());
			
			getUsuarioDAO().incluir(vo);			
			//mailService.enviaEmailSenhaUsuario(vo);
			return null;
		} else {
			printMessage("Login ja cadastrado!", response);
			return null;
		}
	}	
	
	@SuppressWarnings("unchecked")
	public ActionForward alterarIniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		Usuario vo = new Usuario();
		vo.setCodigo(usuarioForm.getIdSelecionado());
		vo.setUsuarioSistema(getUsuario(request));
		List<Usuario> lista = getUsuarioDAO().consultar(vo);
		 
		vo = lista.get(0);
		printJsonObjectToStream(vo, response);
		
		return null;
	}	
	
	public ActionForward alterar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		Usuario vo = new Usuario();
		vo.setCodigo(usuarioForm.getIdSelecionado());
		vo.setNome(usuarioForm.getNome());
		vo.setEmail(usuarioForm.getEmail());
		vo.setTelefone(usuarioForm.getTelefone());
		vo.setTipo(TipoUsuario.setValue(usuarioForm.getAdmin()));
		vo.setUsuarioSistema(getUsuario(request));
		
		Usuario attached = getUsuarioDAO().consultar(vo).get(0);
		vo.setSenha(attached.getSenha());
		
		getUsuarioDAO().alterar(vo);
		
		if(vo.getCodigo().equals(getUsuario(request).getCodigo())) {
			Integer empresa = getUsuario(request).getEmpresa().getCodigo();
			vo.setEmpresa(new Empresa(empresa));
			setUsuario(request, vo);
		}
		
		return null;
	}
	
	public ActionForward excluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		getUsuarioDAO().excluir(usuarioForm.getIdSelecionado());
		
		return mapping.findForward("body");
	}
	
	public ActionForward alterarSenha(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		Usuario vo = getUsuario(request);
		vo.setSenha(usuarioForm.getSenha());
		
		getUsuarioDAO().alterar(vo);
		
		return null;
	}
	
	@SuppressWarnings("unchecked")
	public ActionForward enviarSenha(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroUsuarioForm usuarioForm = (CadastroUsuarioForm) form;
		Usuario vo = new Usuario();
		vo.setCodigo(usuarioForm.getIdSelecionado());
		vo.setUsuarioSistema(getUsuario(request));
		List<Usuario> lista = getUsuarioDAO().consultar(vo);
		 
		vo = lista.get(0);
		vo.setSenha(gerarSenhaRandomica());
		vo.setUsuarioSistema(getUsuario(request));
		
		getUsuarioDAO().alterar(vo);
		mailService.enviaEmailSenhaUsuario(vo);
		
		return null;
	}

	
	private void consultar(CadastroUsuarioForm usuarioForm, HttpServletRequest request) {
		Usuario vo = new Usuario();
		vo.setNome(usuarioForm.getNomeConsultar());
		vo.setAtivo(Ativo.setValue(usuarioForm.getAtivoConsultar()));
		vo.setUsuarioSistema(getUsuario(request));
		
		List<Usuario> listaResultado = getUsuarioDAO().consultar(vo);
		request.setAttribute("listaResultado", listaResultado);
	}
}
